package network.server.handler.LibraryHandler;

import common.model.Entity.libraryEntity.BookItem;
import common.model.Entity.libraryEntity.Borrow;
import common.model.Entity.libraryEntity.BorrowingRules;
import module.library.service.BorrowService;
import module.library.service.impl.BorrowServiceImpl;
import network.protocol.Request;
import network.protocol.Response;
import network.server.RequestHandler;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * 借阅与归还业务请求处理器。
 *
 * <p>负责将网络层 {@link Request} 转换为对 {@link BorrowService} 的调用，
 * 并返回统一的 {@link Response} 结果。</p>
 */

public class BorrowHandler implements RequestHandler {
    /** 借阅服务单例。 */
    private final BorrowService borrowService = BorrowServiceImpl.getInstance();
    /**
     * 入口处理方法。
     *
     * @param req 客户端请求
     * @return 封装后的响应对象，成功时携带业务数据，失败时携带错误信息
     */
    @Override
    public Response<?> handle(Request req) {
        Map<String, Object> params = req.getParams();
        String action = (String) params.get("action");
        return switch (action) {
            case "borrow" -> handleBorrow(req);
            case "return" -> handleReturn(req);
            case "userBorrowRecord"-> handleUserBorrowRecord(req);
            default -> Response.error("不是可用的操作");
        };
    }
    /**
     * 处理“借阅图书”请求。
     *
     * @param req 原始请求
     * @return 包含借阅结果的 {@link Response}
     */
    private Response<?> handleBorrow(Request req) {
        Map<String, Object> borrowParam = req.getParams();
//        Long itemId = (Long) borrowParam.get("itemId");
//        Long userId = (Long) borrowParam.get("userId");
        Long itemId = ((Number) borrowParam.get("bookItemId")).longValue();
        Long userId = ((Number) borrowParam.get("userId")).longValue();
        return borrowService.borrowBook(itemId, userId);
    }

    /**
     * 处理“归还图书”请求。
     *
     * @param req 原始请求
     * @return 包含归还结果及罚款信息的 {@link Response}
     */
    private Response<?> handleReturn(Request req) {
        Map<String, Object> returnParam = req.getParams();
        Long  itemId = (Long) returnParam.get("bookItemId");
        Long userId = (Long) returnParam.get("userId");
        return borrowService.returnBook(itemId, userId);
    }

    /**
     * 处理“查询用户当前活跃借阅记录”请求。
     *
     * @param req 原始请求
     * @return 包含借阅记录列表的 {@link Response}
     */
    private Response<?> handleUserBorrowRecord(Request req) {
        Long userId = Long.valueOf(String.valueOf(req.getParams().get("userId")));
        return borrowService.findActiveBorrowByUser(userId);
    }
}

